import axios, { AxiosInstance, InternalAxiosRequestConfig, AxiosResponse } from 'axios'
import { ElMessage } from 'element-plus'
import qs from 'qs'

// 请求白名单，无须token的接口
const whiteList: string[] = ['/login', '/refresh-token']

// 创建axios实例
const service: AxiosInstance = axios.create({
    baseURL: import.meta.env.VITE_API_BASE_URL || '/api', // API基础URL
    timeout: 10000, // 请求超时时间
    withCredentials: false, // 禁用 Cookie 等信息
    // 自定义参数序列化函数
    paramsSerializer: (params) => {
        return qs.stringify(params, { allowDots: true })
    }

})

// 请求拦截器
service.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
        // 是否需要设置 token
        let isToken = (config!.headers || {}).isToken === false
        whiteList.some((v) => {
            if (config.url && config.url.indexOf(v) > -1) {
                return (isToken = false)
            }
        })

        // 在发送请求之前做些什么
        const token = localStorage.getItem('token')
        if (token && !isToken) {
            config.headers.Authorization = `Bearer ${token}`
        }

        const method = config.method?.toUpperCase()
        // 防止 GET 请求缓存
        if (method === 'GET') {
            config.headers['Cache-Control'] = 'no-cache'
            config.headers['Pragma'] = 'no-cache'
        }
        // 自定义参数序列化函数
        else if (method === 'POST') {
            const contentType = config.headers['Content-Type'] || config.headers['content-type']
            if (contentType === 'application/x-www-form-urlencoded') {
                if (config.data && typeof config.data !== 'string') {
                    config.data = qs.stringify(config.data)
                }
            }
        }

        // 显示loading
        // ElLoading.service({ fullscreen: true })

        return config
    },
    (error) => {
        // 对请求错误做些什么
        console.error('请求错误:', error)
        return Promise.reject(error)
    }
)

// 响应拦截器
service.interceptors.response.use(
    (response: AxiosResponse) => {
        // 隐藏loading
        // ElLoading.service().close()

        const { code, data, msg } = response.data

        // 根据后端返回的状态码进行处理
        if (code === 200 || code === 0) {
            return data
        } else if (code === 401) {
            // 未授权，清除token并跳转到登录页
            localStorage.removeItem('token')
            window.location.href = '/login'
            ElMessage.error('登录已过期，请重新登录')
            return Promise.reject(new Error(msg || '登录已过期'))
        } else {
            ElMessage.error(msg || '请求失败')
            return Promise.reject(new Error(msg || '请求失败'))
        }
    },
    (error) => {
        // 隐藏loading
        // ElLoading.service().close()

        console.error('响应错误:', error)

        if (error.response) {
            const { status, data } = error.response
            switch (status) {
                case 400:
                    ElMessage.error(data.message || '请求参数错误')
                    break
                case 401:
                    localStorage.removeItem('token')
                    window.location.href = '/login'
                    ElMessage.error('登录已过期，请重新登录')
                    break
                case 403:
                    ElMessage.error('没有权限访问')
                    break
                case 404:
                    ElMessage.error('请求的资源不存在')
                    break
                case 500:
                    ElMessage.error('服务器内部错误')
                    break
                default:
                    ElMessage.error(data.message || '网络错误')
            }
        } else if (error.request) {
            ElMessage.error('网络连接失败')
        } else {
            ElMessage.error('请求配置错误')
        }

        return Promise.reject(error)
    }
)

export default service